package ca.etsmtl.log120.tp3.rangs.listes;

import java.util.ArrayList;

import ca.etsmtl.log120.tp3.mains.RangPoker;
import ca.etsmtl.log120.tp3.mains.ReqAnalyseMain;
import ca.etsmtl.log120.tp3.rangs.Brelan;
import ca.etsmtl.log120.tp3.rangs.Carre;
import ca.etsmtl.log120.tp3.rangs.CarteSuperieure;
import ca.etsmtl.log120.tp3.rangs.Couleur;
import ca.etsmtl.log120.tp3.rangs.DeuxPaires;
import ca.etsmtl.log120.tp3.rangs.MainPleine;
import ca.etsmtl.log120.tp3.rangs.Paire;
import ca.etsmtl.log120.tp3.rangs.Quinte;
import ca.etsmtl.log120.tp3.rangs.QuinteCouleur;
import ca.etsmtl.log120.tp3.rangs.QuinteRoyale;
import ca.etsmtl.log120.tp3.rangs.Quintuplet;
import ca.etsmtl.log120.tp3.rangs.AbstractRangAnalysable;

/******************************************************
Cours : LOG120
Session : E2011
Groupe : 01
Projet : Laboratoire #3
Etudiants : Nicolas Blais Miko
 	 		Yohan Trepanier-Montpetit
Codes perm. : BLAN24079109
			  TREY16079108
Professeur : Chamseddine Talhi
Charge de labo : Eric Goulet
Nom du fichier : ListeAnalyseurs.java
Date cree : 2011-07-06
Date dern. modif. 2011-07-06
*************************************************** ****
Historique des modifications
*************************************************** ****

***************************************************/

/**
 * Cette classe est la structure de la chaine de responsabilit�
 * 
 * STRATEGIE:	La methode analyseMain doit recevoir la requete qui contient la main a analyser
 *				La main est analyser dans la chaine de responsabilite jusqu'a ce qu'un rang la traite et on retourne le rang en question
 */
public class ListeRangsPokerRegulier extends ArrayList<AbstractRangAnalysable>{
	
	private static ArrayList<AbstractRangAnalysable> listAnalyseurs = new ListeRangsPokerRegulier();
	
	
	private static final long serialVersionUID = 1L;

	/**
	 * Constructeur de la liste des rangs dans l'ordre voulu
	 */
	private ListeRangsPokerRegulier() {
		
		add(new QuinteRoyale());
		add(new Quintuplet());
		add(new QuinteCouleur());
		add(new Carre());
		add(new MainPleine());
		add(new Couleur());
		add(new Quinte());
		add(new Brelan());
		add(new DeuxPaires());
		add(new Paire());
		add(new CarteSuperieure());
	}

	/**
	 * Methode permettant de traiter la requete d'analyse d'une main dans la chaine de responsabilite de cette classe
	 * @param requete La requete contenant la main a analyser
	 * @return Le rang de la main en question
	 */
	public static RangPoker analyseMain(ReqAnalyseMain requete) {
		
		//On parcours la liste des rangs du plus fort rang au plus faible
		for(AbstractRangAnalysable analyseur: listAnalyseurs){
			
			//Si la main a ce rang, on retourne le rang en question
			if(analyseur.reconnaitreMain(requete.getMain())){
				
				//On memorise une copie du rang dans la liste.
				AbstractRangAnalysable analyseurTrouve = analyseur.clone();
				//On refait l'analyse de la main pour memoriser le bon denominateur premier
				//analyseurTrouve.reconnaitreMain(requete.getMain());
				//On determine les specificites de la main en question pour sa comparaison par la suite
				analyseurTrouve.determineResteMain(requete.getMain());
				//On retourne la copie comportant les specificite de la main
				return analyseurTrouve;
			}
		}
		
		//Si la main ne fait partie d'aucun rang, il y a un probleme, on retourne null
		return null;
	}
	
	/**
	 * Accesseur de la liste pour comparer en les rangs en fonction de leur position dans la liste
	 * @return
	 */
	public static ArrayList<AbstractRangAnalysable> getListe(){
		
		return listAnalyseurs;
	}

}
